package com.test.juc;

import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * 可重入锁：可重复可递归调用的锁，在外层使用锁之后，内层依然可以使用
 *
 * 隐式锁
 * 在一个Synchronized修饰的方法或代码块的内部
 * 调用本类的其他Synchronized修饰的方法或代码块时，是永远可以得到锁的
 */
public class ReenterLockDemo {

    static Object objectLockA = new Object();

    /**
     * 同步代码块
     */
    public static void m1(){
        new Thread(()->{
            synchronized (objectLockA){
                System.out.println(Thread.currentThread().getName()+" \t "+ "----外层调用");
                synchronized (objectLockA){
                    System.out.println(Thread.currentThread().getName()+" \t "+ "----中层调用");
                    synchronized (objectLockA){
                        System.out.println(Thread.currentThread().getName()+" \t "+ "----内层调用");
                    }
                }
            }
        }).start();
    }

    public synchronized void m2(){
        System.out.println("------外层");
        m3();
    }
    public synchronized void m3(){
        System.out.println("------中层");
        m4();
    }
    public synchronized void m4(){
        System.out.println("------内层");
    }

    public static void main(String[] args) {
        m1();
        new ReenterLockDemo().m2();
    }
}
